package com.or.interceptor;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.or.api.R;
import com.or.util.TokenUtil;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author wei
 * @date 2025/2/27 16:51
 */
public class LoginInterceptor implements HandlerInterceptor {
    /**
     *
     * @param request  HTTP 请求对象
     * @param response HTTP 响应对象
     * @param handler  处理请求的处理器对象，可能是 Controller 方法或其他类型的处理器
     * @return 是否继续处理请求，如果返回 false，则不会继续执行该请求的处理器方法
     * @throws Exception 如果处理过程中抛出异常
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取处理器方法上的 Auth 注解，用于判断该方法是否需要认证
        // 从请求头中获取 token，用于认证
        String token = request.getHeader("Authorization");
        // 如果 token 不为空且通过验证
        response.setStatus(HttpServletResponse.SC_OK);
        response.setContentType("application/json; charset=UTF-8");
        if (StrUtil.isNotBlank(token)) {
            if (token.startsWith("Bearer ")) {
                token = token.replace("Bearer ", "");
            }
            if (TokenUtil.verifyToken(token)) {
                // 认证成功，继续处理请求
                if (TokenUtil.needCreate(token)) {
                    // 需要刷新
                    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                    response.setHeader("Authorization", TokenUtil.refreshToken(token));
                }
                return true;
            } else {
                // 认证失败
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                response.getWriter().write(JSON.toJSONString(R.fail("token无效")));
            }
        } else {
            // 未提供 token
            response.getWriter().write(JSON.toJSONString(R.fail("未登录")));
        }

        return false;
    }
}